﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;
using System.Data.SQLite;
using LumenWorks.Framework.IO.Csv;


/*
 * autor: Ana Isabel Marques 6052
 * version: 22 de Fevereiro de 2012
 */

namespace LP_Csharp
{
    /*
     * Esta classe é responsável pela criação da base de dados.
     */
    
    class CreateDataBase
    {
        public int totalFicheiros = 10; 
        /*
         * Este método cria as tabelas da base de dados (rebides.db)
         * Cada tabela contém toda a informação relativa aos docentes, por ano
         */
        public void cria_preenche_tabelas()
        {

            SQLiteConnection connection = new SQLiteConnection("Data Source = rebides.db"); //Cria uma conexão à base de dados 'rebides.db'
            connection.Open();//Abre a conexão

            SQLiteTransaction transaction = connection.BeginTransaction();//Inicia uma transacção para melhorar o desempenho de execução.
            
            SQLiteCommand command = connection.CreateCommand();//Cria um comando


            for (int i = 0; i < this.totalFicheiros + 1; i++)
            {
                //Elimina tabela, se esta já existir
                command.CommandText = String.Format("DROP TABLE IF EXISTS reb{0}", i); 
                command.ExecuteNonQuery(); //Método ExecuteNonQuery permite executar operações de catálogo, neste caso, a criação de tabelas
              
                //Cria a tabela com os respectivos atributos, caso esta não exista.
                command.CommandText = String.Format("CREATE TABLE IF NOT EXISTS reb{0}(codigo_docente INTEGER," +
                    "nome_docente TEXT," +
                    "ultimo_grau_docente TEXT," +
                    "curso_docente TEXT," +
                    "categoria_docente TEXT," +
                    "regime_docente TEXT," +
                    "ano INTEGER, " +
                    "tipo_estabelecimento TEXT," +
                    "nome_estabelecimento TEXT)", i);

                command.ExecuteNonQuery();
            }
        
            //Método que preenche as tabelas
            preenche_tabelas(connection, transaction, command);


            transaction.Commit();  //Confirma a transacção
            connection.Close();   //Fecha a conexão
        }

        /**
         *Este método preenche as tabelas da base de dados com base nos ficheiros CSV
         */
        public void preenche_tabelas(SQLiteConnection connection, SQLiteTransaction transaction, SQLiteCommand command)
        {
            int totalAtributos = 9; // número total de atributos de cada tabela

            for (int numFicheiro = 0; numFicheiro <= this.totalFicheiros; numFicheiro++)
            {
                //Cria o CsvReader na respectiva directoria
                CsvReader reader = new CsvReader(new StreamReader(".\\rebcsv\\reb" + numFicheiro + ".csv"), true);

                //Cria um parâmetro para cada atributo da tabela. 
                for (int atributo = 0; atributo < totalAtributos; atributo++)
                {
                    command.Parameters.Add(command.CreateParameter());
                }

                //Inserção dos dados na tabela respectiva
                command.CommandText = String.Format("INSERT INTO reb{0} (codigo_docente," +
                    "nome_docente, " +
                    "ultimo_grau_docente," +
                    "curso_docente," +
                    "categoria_docente," +
                    "regime_docente, " +
                    "ano, " +
                    "tipo_estabelecimento, " +
                    "nome_estabelecimento) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)", numFicheiro);

                //Enquanto existir linhas para ler
                while (reader.ReadNextRecord())
                {
                    for (int atributo = 0; atributo < totalAtributos; atributo++)
                    {
                        //Insere o dado lido do ficheiro no parâmetro correspondente ao atributo respectivo.
                        command.Parameters[atributo].Value = reader[atributo];
                    }

                    //Método ExecuteNonQuery permite executar operações de catálogo, neste caso, a inserção de dados na tabela
                    command.ExecuteNonQuery();
                }
            }
        }
    }
}